## Le temps :
## La dépendance oubliée
Baptiste Langlade
[@baptouuuu](https://twitter.com/baptouuuu)
Dev chez Opéra Energie
Evolution ces dernières années
## La tendance
Note:
réflexion sur notre métier
## Le but
Note:
testabilité et maintenabilité de nos apps
## Leçons apprises
Note:
* injection des dépendances
* l'état global cémal
```php
function myCode() {
return Http::get(...);
}
```
vs
```php
function myCode($http) {
return $http->get(...);
}
```
```php
global $value;
function increment() {
global $value;
++$value;
}
```
vs
```php
$value = function myCode($value) {
return ++$value;
}
```
## Malgré tout ça...
![](pictures/phpunit.png)
Note:
* 29 février
* changement d'heure
## La raison
```php
# Order.php
public function withdrawalPeriodOver(): bool {
$now = new \DateTime('now');
return $this->delivery->diff($now) > new \DateInterval('P15D');
}
```
## Premier problème
Dépendance au temps non explicite du point de vue de l'utilisateur
```withdrawalPeriodOver()``` donnée fixe ou calculée? ¯\\_(ツ)_/¯
## Deuxième problème
2 instanciations avec le même paramètre produit un résultat différent
La classe dépend donc d'un état global qui change à chaque instanciation
## Une solution
Le pattern de l'horloge
Interface ultra minimaliste
```php
interface Clock
{
public function now(): \DateTimeImmutable;
}
```
Implémentation de base
```php
public function now(): \DateTimeImmutable {
return new \DateTimeImmutable('now');
}
```
```php
# Order.php
public function withdrawalPeriodOver(Clock $clock): bool {
$period = $this->delivery->diff($clock->now());
return $period > new \DateInterval('P15D');
}
```
* dépendance explicite
* état local à l'horloge
## Avantages :
* le temps est une dépendance comme une autre
* (réel) test unitaire sur le temps
* facile à mocker
* on peut tester tous les cas particuliers
* rejouer toute l'app à un moment particulier dans le passé (ou le futur)
## Pousser la réflexion un peu plus
La sémantique
"Ubiquitous language"
Déclaratif > impératif
Code impératif
```php
$now = $clock->now();
$diff = $now->diff($this->delivery);
$diff > new DateInterval('P15D');
```
Code déclaratif
```php
$clock
->now()
->elapsedSince($this->delivery)
->longerThan(new WithdrawalPeriod);
```
## Si vous voulez vous amuser
[github.com/innmind/TimeContinuum](https://github.com/innmind/TimeContinuum)
Le temps : la dépendance oubliée
# Questions
Twitter @Baptouuuu
Github @Baptouuuu